home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok59 / lists1.4e / lists.dok next >
Text File  |  1993-11-04  |  6KB  |  172 lines

  1. (**************************************************************************
  2.  
  3. :Program.    Lists.mod
  4. :Contents.   Generic Lists
  5. :Author.     Fridtjof Siebert, Hartmut Goebel [hG]
  6. :Language.   Oberon
  7. :Translator. AmigaOberon V2.00
  8. :History.    V1.0, 17-Jun-90 Fridtjof Siebert
  9. :History.    V1.1, 10-Jan-91 H.Goebel: AddSection...,GoForw./Backw.
  10. :History.    V1.2, 28-Mar-91   [hG] SetMark, ..Area..->..Mark..
  11. :History.    V1.3, 30 Sep 1991 [hG] + GetPred, GetSucc, Swap
  12. :History.    V1.4, 17 Oct 1991 [hG] + IsElement, GoForward/BackwardNil
  13. :Date.       17 Oct 1991 20:48:37
  14.  
  15. **************************************************************************)
  16.  
  17. Dies ist eine Erweiterung des Oberon-Stardard-Moduls 'Lists'.
  18. Die neuen Funktionen erlauben vor allem das direkte Bearbeiten
  19. mehrerer Listenelemente.
  20. Auch das Markieren von List-Bereiche wird jetzt unterstützt.
  21.  
  22.  
  23. Copyright © Original Oberon Standard-Modul 1990 by Fridtjof Siebert
  24. Copyright © Erweiterungen 1990 by Hartmut Goebel
  25.  
  26. Die Erweiterungen dürfen beliebig weitergegeben werden.
  27.  
  28. Ein Hinweis zum Copyright:
  29.   Da Version 1.1 bereits auf AMOK 51 erschienen ist, denke ich, daß
  30.   Fridtjof damit einverstanden ist, das Modul in dieser Form zu
  31.   veröffentlichen.
  32.   Solle sich jedoch eines schönen(?) Tages das Gegenteil
  33.   herausstellen, so können die Ergänzungen aber ohne Probleme einzeln
  34.   weitergegeben werden. Jeder Oberon-Besitzer kann sie dann selbst in
  35.   seinen (mitgelieferten) Source einbinden.
  36.  
  37.  
  38. TYPE
  39.   NodePtr = POINTER TO Node;
  40.   Node = RECORD END;
  41.   List = RECORD END;
  42.   Mark = List;
  43.   DoProc = PROCEDURE(n: NodePtr);
  44.  
  45.   Der Type Mark ist nur wegen der Zuweisungs-Kompatibilität indentisch
  46.   mit List. Die beiden Typen sollten aber als unterschiedlich
  47.   betrachtet werden, zumal sich die Definition von Mark in zukünftigen
  48.   Versionen des Moduls ändern kann!
  49.  
  50.  
  51. PROCEDURE Init(VAR list: List);
  52. PROCEDURE AddHead(VAR list: List; n: NodePtr);
  53. PROCEDURE AddTail(VAR list: List; n: NodePtr);
  54. PROCEDURE Remove(VAR list: List; n: NodePtr);
  55. PROCEDURE RemHead(VAR list: List): NodePtr;
  56. PROCEDURE RemTail(VAR list: List): NodePtr;
  57. PROCEDURE AddBefore(VAR list: List; n, x: NodePtr);
  58. PROCEDURE AddBehind(VAR list: List; n, x: NodePtr);
  59. PROCEDURE Empty(VAR list: List): BOOLEAN;
  60. PROCEDURE CountElements(VAR list: List): LONGINT;
  61. PROCEDURE DoForward(VAR list: List; proc: DoProc);
  62. PROCEDURE DoBackward(VAR list: List; proc: DoProc);
  63. PROCEDURE Next(VAR n: NodePtr): BOOLEAN;
  64. PROCEDURE Previous(VAR n: NodePtr): BOOLEAN;
  65. PROCEDURE Succ(VAR n: NodePtr);
  66. PROCEDURE Pred(VAR n: NodePtr);
  67. PROCEDURE Head(VAR list: List): NodePtr;
  68. PROCEDURE Tail(VAR list: List): NodePtr;
  69.  
  70.   Entsprechen den Prozeduren aus dem Standard-Modul
  71.  
  72.  
  73. PROCEDURE GetSucc(n: NodePtr): NodePtr;
  74. PROCEDURE GetPred(n: NodePtr): NodePtr;
  75.  
  76.   Liefern den Nachfolger (Succ) bzw. Vorgänger (Pred) einer Node.
  77.   Bsp.: erster  := Head(list);
  78.         zweiter := GetSucc(erster);
  79.   Erzeugt das gleiche wie
  80.         erster  := Head(list);
  81.         zweiter := erster;
  82.         zweiter := Succ(zweiter);
  83.  
  84.  
  85. PROCEDURE Swap(VAR list: List; a,b: NodePtr);
  86.  
  87.   Vertauscht die Nodes a und b in einer Liste.
  88.  
  89.  
  90. PROCEDURE IsElement(VAR list: List; e: NodePtr): BOOLEAN;
  91.  
  92.   Testet, ob die angegebene Node in Element der <list> ist.
  93.  
  94.  
  95. PROCEDURE SetMark(VAR mark: Mark; h, t: NodePtr);
  96.  
  97.   Setzt eine Marke auf die Nodes <h> (Anfang) und <t> (Ende) innerhalb
  98.   einer bestehden Liste.
  99.   Eine Mark sollte vor der ersten Benutzung mit
  100.        SetMark(mark,NIL,NIL);
  101.   oder SetMark(mark,node1,node2);
  102.   initialisiert werden.
  103.  
  104.   Ist EIN Argument NIL, so wird es nicht geändert.
  105.   Damit kann man eine der beiden Grenzen ändern, ohne die andere zu
  106.   kennen.
  107.  
  108.   Mit dieser Marke kann fast genauso gearbeitet werden, wie mit einer
  109.   Liste. Es handelt sich also um eine Unterliste.
  110.  Jedoch ist folgendes zu beachen:
  111.   - Das Löschen von Nodes aud einer Mark ist jedoch nicht möglich!!
  112.     Die Notes müssen aus der Liste gelöscht werden, in der sie stehen.
  113.   - Werden Nodes aus der Liste entfernt, ao ist zu beachten, daß ggf.
  114.     Head und Tail der MArk neu gesetzt werden müssen (wenn gerade
  115.     diese Elemente entfernt wurden).
  116.     Es kann sonst zu schlimmen Systemabstützen kommen!
  117.  
  118.  
  119. PROCEDURE AddMarkBefore(VAR list: List; mark: Mark; x: NodePtr);
  120. PROCEDURE AddMarkBehind(VAR list: List; mark: Mark; x: NodePtr);
  121. PROCEDURE AddMarkHead(VAR list: List; mark: Mark);
  122. PROCEDURE AddMarkTail(VAR list: List; mark: Mark);
  123.  
  124.   funktionieren wie Add..., jedoch werden die mit der Mark markierten
  125.   Elemente eingefügt.
  126.   Die Mark, die eingefügt werden soll, kann auch aus nur ein Element
  127.   bestehen.
  128.  
  129.  
  130. PROCEDURE RemoveMark(VAR list: List; mark: Mark);
  131.  
  132.   entfernt die mit der Mark markierten Elemente aus einer Liste. Die
  133.   Mark bleibt hierbei als ein List-Fragment erhalten und kann z.b.
  134.   gleich in eine andere Liste eingefügt werden.
  135.  
  136.   Bsp.:
  137.     Lists.Init(List2);
  138.     Lists.SetMark(Mark,Node1,Node2);
  139.     Lists.RemoveMark(List1,Mark);
  140.     Lists.AddMarkHead(List2,Mark);
  141.  
  142.  
  143. PROCEDURE GoForward(list: List; VAR n: NodePtr; num: LONGINT);
  144. PROCEDURE GoBackward(list: List; VAR n: NodePtr; num: LONGINT);
  145.  
  146.   geht in der angegebenen <list> um <num> Elemente vorwärts/rückwärts,
  147.   jedoch nicht weiter als bis Tail/Head(<list>).
  148.  
  149. PROCEDURE GoForwardNil(VAR n: NodePtr; num: LONGINT);
  150. PROCEDURE GoBackwardNil(VAR n: NodePtr; num: LONGINT);
  151.  
  152.   geht in der angegebenen <list> um <num> Elemente vorwärts/rückwärts,
  153.   gibt NIL zurück, falls das Ende er Liste erreicht ist
  154.  
  155.  
  156. Reversions:
  157.  V1.4, 17 Oct 1991
  158.    + IsElement, GoForwardNil, GoBackwardNil
  159.  
  160.  V1.3, 30-Sep-91
  161.    + GetPred, GetSucc, Swap
  162.  
  163.  V1.2, 28-Mar-91
  164.    Mark eingeführt
  165.    Sections-Proceduren durch Mark-äquivalente ersetzt.
  166.  
  167.  V1.1, 10-Jan-91
  168.    Sections-Procedurem
  169.  
  170.  V1.0, 17-Jun-90
  171.    Original Oberon Standard-Modul
  172.